import os
import logging
from pathlib import Path

# 数据库配置
db_config = {
    'host': '36.111.80.114',
    'user': 'inspection',
    'password': '5dz8PWyy7NDGyJRa',  # 替换为你的MySQL密码
    'database': 'inspection'
}

# 文件保存路径
UPLOAD_FOLDER = 'uploads'
PROCESSED_FOLDER = 'processed'
SPEECHEMO_FOLDER = 'asr'

# 外部同步上传地址（可为空或替换为目标地址）
EXTERNAL_UPLOAD_URL = 'https://yx.iwhalecloud.com/yn/tran/yhy/seat/v2/upload'

# 情绪识别控制与模型配置
# 是否启用逐句情绪识别（True/False）
ENABLE_EMOTION = False
# 本地模型缓存目录（存在时优先从本地加载，避免重复下载）
LOCAL_MODEL_DIR = os.path.join(os.getcwd(), 'model_cache')

# 确保目录存在
os.makedirs(UPLOAD_FOLDER, exist_ok=True)
os.makedirs(PROCESSED_FOLDER, exist_ok=True)
os.makedirs(SPEECHEMO_FOLDER, exist_ok=True)
os.makedirs(LOCAL_MODEL_DIR, exist_ok=True)

#LLM 管理
MODEL_CONFIG = {
    #"api_key": "ms-f6d748fd-6ade-4f3e-88c6-a2ed2a0fe603",  # ModelScope Token
    #"base_url": "https://api-inference.modelscope.cn/v1",
    #"model": "deepseek-ai/DeepSeek-V3.1",
    "api_key": "sk-unaxzmsdzemsihhbujqyjtybmyrmcckkbavfsndaopfgmhjo",  # siliconflow Token
    "base_url": "https://api.siliconflow.cn/v1",
    #"model": "deepseek-ai/DeepSeek-R1-0528-Qwen3-8B",
    "model": "Qwen/Qwen3-8B",
    "temperature": 0.2,
    "top_p": 0.9,
    "max_tokens": 1024,
    "max_retries": 2,
    "retry_sleep": 2.0,
    "max_chars": 18000  # 超长对话裁剪长度
}

DIFY_CONFIG = {
  "base_url": "http://36.111.80.114:28080/v1",
  "api_key": "app-yHx731Gr2PwHtcd86GXEx0n6",
  "user_id": "abc_123"
}

# 业务文件路径配置
RAW_DIR = Path("./test")  # 原始对话目录
LEXICON = Path("./lexicon/biz_lexicon.txt")  # 业务底表路径
SALES_SCRIPT = Path("./guides/sales_script.txt")  # 营销话术

GUIDE_FILES = [  # 引导话术库Excel路径
    Path("./guides/商圈话术.xlsx"),
    Path("./guides/核心厅话术.xlsx")
]

# 热词配置
def load_lexicon():
    """加载业务底表作为热词库"""
    if not LEXICON.exists():
        logging.warning(f"未找到业务底表：{LEXICON}")
        return []
    items = []
    for line in LEXICON.read_text(encoding="utf-8").splitlines():
        t = line.strip()
        if t:
            items.append(t)
    # 去重并按长度排序（长词优先匹配）
    return sorted(set(items), key=lambda x: len(x), reverse=True)

# 预加载热词（仅加载前300个并格式化）
HOTWORDS = load_lexicon()
HOTWORD_STR = "、".join(HOTWORDS[:300])

# LLM 提示词配置
SOCRE_PROMPTS = {
    # 文本清理提示词
    "clean_text": """
        请清理下面的文本，去除时间戳、无关的口头禅、冗余的标点符号等，并且统一金额、流量、速率等单位的格式：
        1. 去掉所有时间戳和标签
        2. 去除无关的口头禅（如"嗯"，"对的"，"是的"等）
        3. 统一单位（如"300兆"转为"300MB"，"1G"转为"1024MB"等）
        4. 保留文本中的有效业务信息
        仅返回清理后的文本，不需要其他说明。
        原文：
        {text}
        清理后的文本：
        """,
    
    # 业务信息提取提示词（旧版，已废弃）
    # "extract_business_info_old": """
    #     请从以下对话中提取关键信息：
    #     1. 客户的需求
    #     2. 业务员回答
    #     3. 是否使用了相关的专业术语（如：携号转网、宽带提速、套餐变更等）
    #
    #     对话：
    #     {text}
    #
    #     输出格式："客户需求": "xxx", "业务员回答": "xxx", "专业术语使用": "术语1"、"术语2"
    #     """,
    
    # 会话概述提示词（新版）
    "extract_business_info": """
你是一个专业的会话分析助手。请对以下客服对话进行简明扼要的概述。

要求：
1. 用1-2句话总结对话的核心内容（不超过100字）
2. 如果对话中有明确的业务办理内容，概述应包含：办理的业务类型、关键参数（如套餐金额、宽带速度等）


对话内容：
{text}

请直接输出概述文本，不需要任何解释或格式标记。
示例输出：
- \"客户咨询携号转网流程，客服解释了办理步骤和注意事项\"
- \"客户办理宽带业务，选择300兆套餐月费59元，包含40G流量\"


概述：
        """,
    
    # 评分系统规则
    "scoring_system_rules": """
        你是专业的质检评审。输入为原始转写对话（可能包含口头禅、重复、误识别、人物前缀如 0: 1: 2: 等）。
        要求：
        - 自动在理解层面忽略噪声（口头禅/重复/乱码/纯数字/时间戳/无意义短句），不要输出任何"清洗说明"或中间过程。
        - 可自行推断说话角色（客户/营业员），不强求显式标注；评分以内容为准。
        - 业务标签只能从"业务底表"选择；若无匹配则返回空数组 []。同义表达需归并为底表中**最相近**的标签名称。
        - 评分原则：采用合理评分标准，评分维度（0~5，允许0.5），即使表现一般也应给予基础分数0.5。
        - "业务引导"维度：
          1. 先判断是否命中"营销引导话术库"（见下方节选），若有命中，必须按子项拆分规则评分（基础分+加分）。
          2. 若未命中，可基于自身理解判断是否存在引导行为，直接给出0~5分。
        - 事件识别核心规则：
            1. **stage（场景阶段）限定**：仅从给定选项中选择，不可自定义。选项为：用户进店、需求沟通、业务办理、问题应对、办理结束。
            2. **event_type（具体事件）要求**：
            - 必须是"服务人员或用户的具体动作/交互行为"，需明确、具象，不可使用模糊表述（如"模糊业务提及""相关沟通"等无效表述）；
            - 需与所选"stage"强匹配（例："用户进店"阶段仅对应"主动打招呼""自我介绍"等，"需求沟通"阶段仅对应"挖掘需求""确认业务意向"等）；
            - 可参考的event_type有效事件类型示例（非全部，可根据实际场景补充同类行为）：
                - 用户进店阶段：主动打招呼（如"您好，请问有什么可以帮您？"）、自我介绍（如"我是本次服务专员XX"）；
                - 需求沟通阶段：挖掘需求（如 "您今天过来是想咨询业务，还是办理具体事项呀？"）、确认业务意向（如 "您刚才提到想了解宽带业务，是需要办理新装吗？"）、明确业务（如 "咱们的补卡业务分当场办理和邮寄两种，您更倾向哪种？"）、客户主动提及明确需求（如 "客户说'补卡'""客户提及'想修改银行卡预留手机号'"）；
                - 业务办理阶段：确认身份（如"麻烦出示一下您的身份证件"）、引导填写资料（如"请在这张表单上填写基本信息"）、告知办理进度（如"您的业务正在审核，大概需要5分钟"）；
                - 问题应对阶段：异议处理（如"您担心的XX问题，我们可以通过XX方式解决"）、解答疑问（如"这个费用是按照XX标准收取的，具体包含XX服务"）、安抚情绪（如"非常抱歉让您久等，我们会尽快处理"）；
                - 办理结束阶段：送别道别（如"业务已办理完成，有问题随时联系我们"）、告知后续服务（如"后续有XX需求，可通过APP或线下网点办理"）。
            3. **count（事件次数）要求**：填写该"具体事件"在交互中实际出现的次数，需为数字（如"1""2"），不可用模糊表述。
        - 严格只输出 JSON，不要任何解释、标题或代码块围栏。
        """,
    
    # 评分维度说明
    "scoring_rubric": """
        【评分维度（0~5，允许0.5）】
        - 业务处理能力：是否准确理解诉求并给出可执行方案/步骤/路径；有约束能否提供替代方案。
          评分标准：能理解客户需求并给出基本解决方案即可得1.5-2.5；提供详细步骤或替代方案可得3-5分。
          评分后，请提供该评分的依据，并从对话中提取相应的关键句子或语境。
        - 服务态度：礼貌、耐心、同理心、积极性。
          评分标准：基本礼貌用语（如"您好"、"谢谢"等）可得1-2分；主动询问、耐心解答可得2-4分；进一步表现出同理心和积极性可得4-5分。
          请提供评分的依据，并从对话中摘取支持该评分的具体句子。
        - 沟通能力：表达清晰、结构有序、关键信息完整、少冗余。
          评分标准：能基本表达意思可得1-2分；表达清晰、信息完整可得3-4分；结构有序、逻辑清晰可得4-5分。
          请提供评分依据，支持该评分的关键对话句子。
        - 问题是否解决：是否已解决；或明确可执行的解决路径；或仍未解决。
          评分标准：采用较为宽松的评分方式，提供解决方向可得2-3分；给出具体解决步骤可得3-4分；问题完全解决或提供明确路径可得4-5分。
          请提供证据，解释评分依据。
        - 业务引导（0~5分）：
          ① 若未命中"营销引导话术库"，可基于自身理解判断是否存在引导行为，直接给出0~2分。
          ② 若命中"营销引导话术库"：依据评分要点进行评分，每完成1项得对应分值，最多得5分。
          评分依据：需明确是否命中话术库，及对应的评分逻辑（自主判断/子项拆分）。
        final_score = 五维分的算术平均（保留一位小数）
        """,
    
    # 输出格式Schema
    "output_schema": """
        【只输出JSON，字段名必须一致】:
        {
          "business_tags": "业务标签",
          "scores": {
            "业务处理能力": 0,
            "服务态度": 0,
            "沟通能力": 0,
            "问题是否解决": 0,
            "业务引导": 0
          },
          "final_score": 0,
          "rationales": {
            "业务处理能力": "不超过100字的理由",
            "服务态度": "不超过100字的理由",
            "沟通能力": "不超过100字的理由",
            "问题是否解决": "不超过100字的理由",
            "业务引导": "需说明是否命中话术库及评分逻辑（如"未命中，自主评3分"或"命中，子项和为3.5"）"
          },
          "resolved": "yes|partial|no",
          "evidence": ["从对话中摘取1-3条关键原句或语境作为证据，尽量简短"],
          "guidance_hits": ["命中的引导要点或话术关键词，若无则返回空数组"],
          "events": 
          [
              {
             "stage": "从【用户进店|需求沟通|业务办理|问题应对|办理结束】中选择1个",
             "event_type": "符合上述要求的具体交互事件（参考示例）",
             "count": "数字格式的事件次数"
            }
            ]
        }
        """
}